/**
 * 基于Promise封装的Ajax请求函数
 * 创建xhr对象
 * 处理参数：加密、拼接name=value&name2=value2
 * 处理get请求：get请求参数拼接到url上
 * xhr.open打开连接
 * 
 * @param {Object} options 配置选项
 * @param {string} options.url 请求地址
 * @param {string} options.method 请求方法，默认GET
 * @param {Object} options.data 请求数据
 * @param {Object} options.headers 请求头
 * @returns {Promise} 返回Promise对象
 */
function ajax(options) {
  return new Promise((resolve, reject) => {
    const {url, method='GET', data={}, headers={}} = options|| {};
    method = method.toUpperCase();
    // 处理请求参数
    let params = [];
    for (const key in data) {
      params.push(encodeURIComponent(key)+'='+encodeURIComponent(data[key]));
    }
    const queryString = params.join('&');
    // 处理GET请求
    if (method === 'GET' && queryString) {
      url += (url.includes('?') ? '&' : '?') + queryString;
    }
    // 创建xhr对象
    const xhr = new XMLHttpRequest();
    // 打开连接
    xhr.open(method, url, true);
    
    // 设置请求头
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    for (const key in headers) {
      xhr.setRequestHeader(key, headers[key]);
    }
    
    // 监听状态变化
    xhr.onreadystatechange = function() {
      if (xhr.readyState === 4) {
        if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
          try {
            const response = JSON.parse(xhr.responseText);
            resolve(response);
          } catch (e) {
            resolve(xhr.responseText);
          }
        } else {
          reject(new Error(`请求失败，状态码：${xhr.status}`));
        }
      }
    };
    
    // 错误处理
    xhr.onerror = function() {
      reject(new Error('网络错误'));
    };
    
    // 超时处理
    xhr.ontimeout = function() {
      reject(new Error('请求超时'));
    };
    
    // 发送请求
    xhr.send(method=='GET'?null:queryStr)
  });
}

// 使用示例
/*
ajax({
  url: 'https://api.example.com/data',
  method: 'GET',
  data: { id: 1 }
})
  .then(response => console.log(response))
  .catch(error => console.error(error));
*/ 